﻿#ifndef __EVENTLOOP_H__
#define __EVENTLOOP_H__

#include <thread>
#include <memory>
#include <vector>
#include <mutex>
#include <functional>

class Epoller;
class Channel;
class TimerWheel;

class EventLoop
{
private:
    // 事件监控
    std::thread::id m_tid;                      // 线程id
    int m_eventfd;                              //_eventfd声明要在_eventfd_channel的前面
    std::unique_ptr<Channel> m_eventfd_channel; // 使用智能指针，当EventLoop释放时，_eventfd_channel自动释放
    std::unique_ptr<Epoller> m_epoller;
    // 任务处理
    using TaskFunc_t = std::function<void()>;
    std::vector<TaskFunc_t> m_tasks;
    std::mutex m_mutex;

    // 时间轮
    std::unique_ptr<TimerWheel> m_timerwheel;

public:
    // 初始化事件fd
    static int initEventfd();
    // 读取事件fd
    void readEventfd();
    // 唤醒事件fd
    void wakeupEventfd();
public:
    EventLoop();
    ~EventLoop();
    // 启动事件循环
    void start();
    // 添加任务
    void pushInLoop(const TaskFunc_t &task);
    // NOTE: 执行任务, 如果在对应线程中，直接执行，不在，则压入任务队列
    void runInLoop(const TaskFunc_t &task);
    void assertInLoop();
    // 判断是否在当前线程
    bool isInLoopThread() const; 
    // 执行所有任务
    void runAllTask();
    // 更新事件监控
    void updateChannel(Channel *channel);
    // 删除事件监控
    void removeChannel(Channel *channel);

    // 时间轮
    void addTimerTask(uint64_t id, uint32_t timeout, const TaskFunc_t &task);
    void refreshTimerTask(uint64_t id);
    void cancelTimerTask(uint64_t id);
    bool hasTimerTask(uint64_t id);
};

#endif // __EVENTLOOP_H__
